import { getCartList, updateCartList, deleteCartList } from '@/api/cart'
import { Toast } from 'vant'

export default {
  namespaced: true,
  state () {
    // 定义购物车数据状态
    return {
      cartList: [] // 初始化为空数组
    }
  },
  mutations: {
    // 定义用于修改购物车数据的 mutation
    setCartList (state, data) {
      state.cartList = data // 将购物车数据设置为从API获取的数据
    },

    // 修改商品选中(单个商品)
    toggleChecked (state, id) {
      const goods = state.cartList.find((item) => item.goods_id === id)
      console.log(goods);
      goods.isChecked = !goods.isChecked
    },

    // 全选功能
    toggleAllChecked (state, flag) {
      state.cartList.forEach((item) => {
        item.isChecked = flag
      })
    },

    // 本地修改商品数量
    updateCartList (state, { id, num }) {
      const goods = state.cartList.find((item) => {
        return item.goods_id === id
      })
      goods.goods_num = num
    }
  },
  actions: {
    // 异步动作，用于从API获取购物车数据
    async getCartList (context) {
      // 发起异步请求，等待API响应
      const { data } = await getCartList()

      // 遍历购物车数据，为每个元素添加isChecked属性
      data.list.forEach(element => {
        element.isChecked = true
      })

      // 提交 mutation 来更新购物车数据
      context.commit('setCartList', data.list)
    },

    // 发送修改请求
    async updateCartList (context, body) {
      // 提交本地修改
      context.commit('updateCartList', body)
      const { id, num, skuid } = body

      // 提交修改的数量
      await updateCartList(id, num, skuid)
    },

    // 发送删除请求
    async deleteCartList (context) {
      const goods = context.getters.selectProduct
      const cartId = goods.map((item) => {
        return item.id
      })
      await deleteCartList(cartId)
      Toast('删除成功')

      // 重新拉取购物车信息
      context.dispatch('getCartList')
    }
  },
  getters: {
    // 定义购物车总数的 getter
    cartTotal (state) {
      // 使用reduce函数计算购物车中所有商品的总数
      return state.cartList.reduce((sum, item, index) => sum + item.goods_num, 0)
    },
    // 定义已选择商品的 getter
    selectProduct (state) {
      // 使用过滤器从购物车中获取已选择的商品
      return state.cartList.filter(item => item.isChecked)
    },
    // 定义已选择商品的总数 getter
    selectCount (state, getters) {
      // 使用reduce函数计算已选择商品的总数
      return getters.selectProduct.reduce((sum, item) => {
        return sum + item.goods_num
      }, 0)
    },
    // 定义已选择商品的总金额 getter
    productAmount (state, getters) {
      // 使用reduce函数计算已选择商品的总金额，并以两位小数形式返回
      return getters.selectProduct.reduce((sum, item) => {
        return sum + item.goods_num * item.goods.goods_price_min
      }, 0).toFixed(2)
    },

    // 定义全选状态
    isAllChecked (state) {
      return state.cartList.every((item) => item.isChecked)
    }
  }
}